/*     */ package com.zimbra.cs.account.accesscontrol;
/*     */ 
/*     */ import com.zimbra.common.service.ServiceException;
/*     */ import com.zimbra.common.util.Log;
/*     */ import com.zimbra.common.util.ZimbraLog;
/*     */ import com.zimbra.cs.mailbox.ACL;
/*     */ import java.io.PrintStream;
/*     */ import java.util.ArrayList;
/*     */ import java.util.Collection;
/*     */ import java.util.HashSet;
/*     */ import java.util.List;
/*     */ import java.util.Set;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public class ZimbraACL
/*     */ {
/*  31 */   private static final Log sLog = ZimbraLog.acl;
/*     */   
/*     */ 
/*  34 */   private List<ZimbraACE> mAces = new ArrayList();
/*     */   
/*     */ 
/*  37 */   private Set<ZimbraACE> mAllowedNotDelegable = new HashSet();
/*     */   
/*     */ 
/*  40 */   private Set<ZimbraACE> mAllowedDelegable = new HashSet();
/*     */   
/*     */ 
/*  43 */   private Set<ZimbraACE> mDenied = new HashSet();
/*     */   
/*     */ 
/*  46 */   private Set<ZimbraACE> mSubDomain = new HashSet();
/*     */   
/*     */ 
/*  49 */   private Set<Right> mContainsRight = new HashSet();
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   ZimbraACL(String[] aces, TargetType targetType, String targetName)
/*     */     throws ServiceException
/*     */   {
/*  62 */     RightManager rm = RightManager.getInstance();
/*  63 */     for (String aceStr : aces) {
/*     */       try {
/*  65 */         ZimbraACE ace = new ZimbraACE(aceStr, rm, targetType, targetName);
/*  66 */         addACE(ace);
/*     */       } catch (ServiceException e) {
/*  68 */         ZimbraLog.acl.warn("cannot parse ACE: " + aceStr + ", skipped", e);
/*     */       }
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   ZimbraACL(Set<ZimbraACE> aces)
/*     */     throws ServiceException
/*     */   {
/*  82 */     grantAccess(aces);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private ZimbraACL(ZimbraACL other)
/*     */   {
/*  91 */     if (other.mAces != null) {
/*  92 */       for (ZimbraACE ace : other.mAces) {
/*  93 */         addACE(ace.clone());
/*     */       }
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */   public ZimbraACL clone()
/*     */   {
/* 101 */     return new ZimbraACL(this);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private void addACE(ZimbraACE aceToGrant)
/*     */   {
/* 120 */     if (aceToGrant.deny()) {
/* 121 */       this.mAces.add(0, aceToGrant);
/* 122 */       this.mDenied.add(aceToGrant);
/* 123 */     } else if (!aceToGrant.canDelegate()) {
/* 124 */       this.mAces.add(aceToGrant);
/*     */       
/* 126 */       if (aceToGrant.subDomain()) {
/* 127 */         this.mSubDomain.add(aceToGrant);
/*     */       } else {
/* 129 */         this.mAllowedNotDelegable.add(aceToGrant);
/*     */       }
/*     */     } else {
/* 132 */       this.mAces.add(this.mDenied.size(), aceToGrant);
/* 133 */       this.mAllowedDelegable.add(aceToGrant);
/*     */     }
/* 135 */     this.mContainsRight.add(aceToGrant.getRight());
/*     */   }
/*     */   
/*     */   private void removeACE(ZimbraACE aceToRevoke) {
/* 139 */     this.mAces.remove(aceToRevoke);
/* 140 */     if (aceToRevoke.deny()) {
/* 141 */       this.mDenied.remove(aceToRevoke);
/* 142 */     } else if (aceToRevoke.canDelegate()) {
/* 143 */       this.mAllowedDelegable.remove(aceToRevoke);
/* 144 */     } else if (aceToRevoke.subDomain()) {
/* 145 */       this.mSubDomain.remove(aceToRevoke);
/*     */     } else
/* 147 */       this.mAllowedNotDelegable.remove(aceToRevoke);
/* 148 */     this.mContainsRight.remove(aceToRevoke.getRight());
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   private boolean grant(ZimbraACE aceToGrant)
/*     */   {
/* 156 */     for (ZimbraACE ace : this.mAces) {
/* 157 */       if ((ace.isGrantee(aceToGrant.getGrantee())) && (ace.getRight().isTheSameRight(aceToGrant.getRight())))
/*     */       {
/*     */ 
/* 160 */         boolean changed = false;
/*     */         
/*     */ 
/* 163 */         if (ace.getRightModifier() != aceToGrant.getRightModifier())
/*     */         {
/*     */ 
/* 166 */           ace.setRightModifier(aceToGrant.getRightModifier());
/* 167 */           changed = true;
/*     */         }
/*     */         
/*     */ 
/* 171 */         if ((aceToGrant.getGranteeType() == GranteeType.GT_GUEST) || (aceToGrant.getGranteeType() == GranteeType.GT_KEY)) {
/* 172 */           String newSecret = aceToGrant.getSecret();
/* 173 */           if ((newSecret != null) && (!newSecret.equals(ace.getSecret()))) {
/* 174 */             ace.setSecret(newSecret);
/* 175 */             changed = true;
/*     */           }
/*     */         }
/*     */         
/* 179 */         return changed;
/*     */       }
/*     */     }
/*     */     
/*     */ 
/* 184 */     if ((aceToGrant.getGranteeType() == GranteeType.GT_KEY) && (aceToGrant.getSecret() == null))
/* 185 */       aceToGrant.setSecret(ACL.generateAccessKey());
/* 186 */     addACE(aceToGrant);
/* 187 */     return true;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   private boolean revoke(ZimbraACE aceToRevoke)
/*     */   {
/* 195 */     for (ZimbraACE ace : this.mAces) {
/* 196 */       if ((ace.isGrantee(aceToRevoke.getGrantee())) && (ace.getRight().getName().equals(aceToRevoke.getRight().getName())) && (ace.getRightModifier() == aceToRevoke.getRightModifier()))
/*     */       {
/*     */ 
/* 199 */         removeACE(ace);
/* 200 */         return true;
/*     */       }
/*     */     }
/* 203 */     return false;
/*     */   }
/*     */   
/*     */   List<ZimbraACE> grantAccess(Set<ZimbraACE> acesToGrant) {
/* 207 */     List<ZimbraACE> granted = new ArrayList();
/* 208 */     for (ZimbraACE ace : acesToGrant) {
/* 209 */       if (grant(ace))
/* 210 */         granted.add(ace);
/*     */     }
/* 212 */     return granted;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   List<ZimbraACE> revokeAccess(Set<ZimbraACE> acesToRevoke)
/*     */   {
/* 231 */     List<ZimbraACE> revoked = new ArrayList();
/* 232 */     for (ZimbraACE ace : acesToRevoke) {
/* 233 */       if (revoke(ace))
/* 234 */         revoked.add(ace);
/*     */     }
/* 236 */     return revoked;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   List<ZimbraACE> getAllACEs()
/*     */   {
/* 244 */     return this.mAces;
/*     */   }
/*     */   
/*     */   Set<ZimbraACE> getAllowedNotDelegableACEs()
/*     */   {
/* 249 */     return this.mAllowedNotDelegable;
/*     */   }
/*     */   
/*     */   Set<ZimbraACE> getAllowedDelegableACEs()
/*     */   {
/* 254 */     return this.mAllowedDelegable;
/*     */   }
/*     */   
/*     */   Set<ZimbraACE> getDeniedACEs()
/*     */   {
/* 259 */     return this.mDenied;
/*     */   }
/*     */   
/*     */   Set<ZimbraACE> getSubDomainACEs() {
/* 263 */     return this.mSubDomain;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   List<ZimbraACE> getACEs(Set<? extends Right> rights)
/*     */   {
/* 273 */     List<ZimbraACE> result = new ArrayList();
/*     */     
/* 275 */     for (ZimbraACE ace : this.mAces) {
/* 276 */       if (rights.contains(ace.getRight())) {
/* 277 */         result.add(ace);
/*     */       }
/*     */     }
/*     */     
/* 281 */     return result;
/*     */   }
/*     */   
/*     */   List<String> serialize() {
/* 285 */     List<String> aces = new ArrayList();
/*     */     
/* 287 */     for (ZimbraACE ace : this.mAces) {
/* 288 */       aces.add(ace.serialize());
/*     */     }
/* 290 */     return aces;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private static String dump(Collection<ZimbraACE> aces)
/*     */   {
/* 299 */     StringBuffer sb = new StringBuffer();
/* 300 */     for (ZimbraACE ace : aces) {
/* 301 */       sb.append(ace.dump(false) + " ");
/*     */     }
/* 303 */     return sb.toString();
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   public static void main(String[] args)
/*     */   {
/* 311 */     String[] aces = { "99999999-9999-9999-9999-999999999999 pub -invite", "f36fb465-c54b-4d1e-b2d5-5786078bf1d3 grp viewFreeBusy", "44d2b6b8-8001-4305-a9c0-419d04a44a9a usr -invite", "3b110e75-4003-4634-a3ec-fea456ad7d84 grp -invite" };
/*     */     
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */     try
/*     */     {
/* 319 */       ZimbraACL acl = new ZimbraACL(aces, TargetType.account, "user1@phoebe.mac");
/* 320 */       List<String> serialized = acl.serialize();
/* 321 */       for (String ace : serialized)
/* 322 */         System.out.println(ace);
/*     */     } catch (ServiceException e) {
/* 324 */       System.out.println(e.getMessage());
/* 325 */       e.printStackTrace();
/*     */     }
/*     */   }
/*     */ }


/* Location:              /home/mint/zimbrastore.jar!/com/zimbra/cs/account/accesscontrol/ZimbraACL.class
 * Java compiler version: 7 (51.0)
 * JD-Core Version:       0.7.1
 */